package cl.easyRestaurant.business.pedidos;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import cl.easyRestaurant.models.pedidos.DetallePedidoModel;
import cl.easyRestaurant.models.pedidos.PedidoModel;
import cl.easyRestaurant.dataAccess.persistence.Cliente;
import cl.easyRestaurant.dataAccess.persistence.Cocinero;
import cl.easyRestaurant.dataAccess.persistence.DetallePedido;
import cl.easyRestaurant.dataAccess.persistence.DetallePedidoHome;
import cl.easyRestaurant.dataAccess.persistence.DetallePedidoId;
import cl.easyRestaurant.dataAccess.persistence.Mozo;
import cl.easyRestaurant.dataAccess.persistence.Pedido;
import cl.easyRestaurant.dataAccess.persistence.PedidoHome;
import cl.easyRestaurant.dataAccess.persistence.Producto;
import cl.easyRestaurant.dataAccess.persistence.ProductoHome;

@Stateless
public class PedidosBusiness implements IPedidosBusiness {
		
	@Override
	public PedidoModel GetPedidoModel(Integer idPedido)	{
		
		PedidoHome pedidoHome = new PedidoHome();
		
		Pedido result = pedidoHome.findById(idPedido);
		
		PedidoModel pedido = this.toPedidoModel(result);
		
		return pedido;
		
	}
	
	@Override
	public DataModel<DetallePedidoModel> GetDetallePedido(Integer idPedido) {
		
		DetallePedidoHome detallePedidoHome = new DetallePedidoHome();
		
		DataModel<DetallePedidoModel> detallePedidoCliente = new ListDataModel<DetallePedidoModel>();
		
		List<DetallePedido> result = detallePedidoHome.getAllByOrder(idPedido);
		
		List<DetallePedidoModel> data = new ArrayList<DetallePedidoModel>(result.size());
		
		for(DetallePedido dp : result) {
			
			DetallePedidoModel pedido = this.toDetallePedidoModel(dp);
			
			data.add(pedido);
			
		}
		
		detallePedidoCliente.setWrappedData(data);
		
		return detallePedidoCliente;
		
	}
	
	@Override
	public DataModel<PedidoModel> GetPedidosCancelablesCliente(String idCliente) {
		
		PedidoHome pedidoHome = new PedidoHome();
		
		DataModel<PedidoModel> pedidosCliente = new ListDataModel<PedidoModel>();
		
		List<Pedido> result = pedidoHome.getAllByClient(idCliente);
		
		List<PedidoModel> data = new ArrayList<PedidoModel>(result.size());
		
		for(Pedido p : result){
			
			if (!p.getEstadoPedido().equals("Cancelado") &&
				!p.getEstadoPedido().equals("Cerrado")) {
			
			PedidoModel pedido = this.toPedidoModel(p);
			
			data.add(pedido);
			
			}
			
		}
		
		pedidosCliente.setWrappedData(data);
		
		return pedidosCliente;
		
	}

	/**
	 * @param p
	 * @return
	 */
	private PedidoModel toPedidoModel(Pedido p) {
		
		PedidoModel pedido = new PedidoModel();
		
		pedido.setEstadoPedido(p.getEstadoPedido());
		
		pedido.setHoraPedido(p.getHoraPedido());
		
		Cocinero co = p.getCocinero();
		
		if (co != null){
			pedido.setIdChef(co.getIdCocinero());	
		}
		
		Cliente cli = p.getCliente();
		
		if (cli != null){
			pedido.setIdCliente(cli.getIdCli());	
		}
		
		Mozo mo = p.getMozo();
		
		if (mo != null){
			pedido.setIdMozo(mo.getIdMozo());	
		}
		
		pedido.setIdPedido(p.getIdPedido());
		
		return pedido;
		
	}
	
	@Override
	public void CancelarPedidoCliente(Integer idPedido)	{
		
		PedidoHome pedidoHome = new PedidoHome();
		
		Pedido result = pedidoHome.findById(idPedido);
		
		result.setEstadoPedido("Cancelado");
		
		pedidoHome = new PedidoHome();
		
		pedidoHome.merge(result);
		
	}
	
	private DetallePedidoModel toDetallePedidoModel(DetallePedido detallePedido) {
		
		DetallePedidoModel detallePedidoModel = new DetallePedidoModel();
		
		detallePedidoModel.setCantidadPlato(detallePedido.getCantidadPlato());
		
		detallePedidoModel.setEstadoPlato(detallePedido.getEstadoPlato());
		
		detallePedidoModel.setGlosaPlato(detallePedido.getGlosaPlato());
		
		return detallePedidoModel;
		
	}

	@Override
	public DataModel<PedidoModel> GetPedidosCerrablesCocinero(String idCocinero) {
		
		PedidoHome pedidoHome = new PedidoHome();
		
		DataModel<PedidoModel> pedidosCerrables = new ListDataModel<PedidoModel>();
		
		List<Pedido> result = pedidoHome.getAllByChef(idCocinero);
		
		List<PedidoModel> data = new ArrayList<PedidoModel>(result.size());
		
		for(Pedido p : result){
			
			if (p.getEstadoPedido().equals("Cancelado")) {
			
				PedidoModel pedido = this.toPedidoModel(p);
				
				data.add(pedido);
			
			}
			
		}
		
		pedidosCerrables.setWrappedData(data);
		
		return pedidosCerrables;
		
	}

	@Override
	public void CerrarPedidoCocinero(Integer idPedido) {
		
		PedidoHome pedidoHome = new PedidoHome();
		
		Pedido result = pedidoHome.findById(idPedido);
		
		result.setEstadoPedido("Cerrado");
		
		pedidoHome = new PedidoHome();
		
		pedidoHome.merge(result);
		
	}

	@Override
	public Integer GetLastId() {

		PedidoHome pedidoHome = new PedidoHome();
		
		return pedidoHome.getLastId();
		
	}

	@Override
	public void SavePedido(PedidoModel pedido) {
		
		PedidoHome pedidoHome = new PedidoHome();
		
		pedidoHome.persist(this.toPedido(pedido));
		
	}
	
	private Pedido toPedido(PedidoModel p) {
		
		Pedido pedido = new Pedido();
		
		pedido.setEstadoPedido(p.getEstadoPedido());
		
		pedido.setFechaPedido(p.getFechaPedido());
		
		pedido.setHoraPedido(p.getHoraPedido());
		
		Cocinero co = new Cocinero();
		
		co.setIdCocinero(p.getIdChef());
		
		pedido.setCocinero(co);
		
		Cliente cli = new Cliente();
		
		cli.setIdCli(p.getIdCliente());
		
		pedido.setCliente(cli);
		
		pedido.setIdPedido(p.getIdPedido());
		
		return pedido;
		
	}

	@Override
	public void AddProductoToPedido(String idProducto, PedidoModel pedido) {
		
		boolean exists = false;
		
		List<DetallePedido> result = new DetallePedidoHome().getAllByOrder(pedido.getIdPedido());
		
		for(int i = 0 ; i < result.size() && !exists ; i++) {
			
			if (result.get(i).getId().getIdProducto().toString().equalsIgnoreCase(idProducto)) {
				
				exists = true;
				
			}
			
		}
		
		if (!exists) {
		
			ProductoHome productoHome = new ProductoHome();
			
			Producto producto = productoHome.findById(idProducto);
			
			DetallePedido dp = new DetallePedido();
			
			dp.setCantidadPlato(1);
			
			dp.setEstadoPlato("Solicitado");
			
			dp.setGlosaPlato(producto.getGlosaProducto());
			
			DetallePedidoId id = new DetallePedidoId();
			
			id.setIdPedido(pedido.getIdPedido());
			
			id.setIdProducto(idProducto);
			
			dp.setId(id);
			
			dp.setPedido(this.toPedido(pedido));
			
			dp.setProducto(producto);
			
			DetallePedidoHome dpHome = new DetallePedidoHome();
			
			dpHome.persist(dp);
		
		}
		
	}

	@Override
	public void ConfirmarPedido(PedidoModel pedido) {

		PedidoHome pedidoHome = new PedidoHome();
		
		Pedido p = this.toPedido(pedido);
		
		p.setEstadoPedido("Confirmado");
		
		pedidoHome.merge(p);
		
	}

}
